home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Meeting Pearls 4
/
Meeting Pearls Vol. IV (1996)(GTI - Schatztruhe)[!].iso
/
Pearls
/
etech
/
GALer20
/
Source
/
GALer
/
Reasm.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-04-05
|
62KB
|
1,832 lines
/******************************************************************************
** Reasm.c
*******************************************************************************
**
** description:
**
** This file contains some subroutines for GALer's reassembler.
**
******************************************************************************/
/********************************* includes **********************************/
#include <libraries/mui.h>
#include <exec/memory.h>
#include <libraries/dos.h>
#include <intuition/intuition.h>
#include <intuition/gadgetclass.h>
#include <libraries/gadtools.h>
#include <libraries/locale.h>
#include <ctype.h>
#include <string.h>
#include <proto/locale.h>
#include <proto/intuition.h>
#include <proto/gadtools.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/muimaster.h>
#include "GALer.h"
#include "Localize.h"
/********************************** defines **********************************/
#define RASM_ID01 1 /* gadget IDs and the pin numbers */
#define RASM_ID02 2 /* must be the same */
#define RASM_ID03 3
#define RASM_ID04 4
#define RASM_ID05 5
#define RASM_ID06 6
#define RASM_ID07 7
#define RASM_ID08 8
#define RASM_ID09 9
#define RASM_ID10 10
#define RASM_ID11 11
#define RASM_ID12 12
#define RASM_ID13 13
#define RASM_ID14 14
#define RASM_ID15 15
#define RASM_ID16 16
#define RASM_ID17 17
#define RASM_ID18 18
#define RASM_ID19 19
#define RASM_ID20 20
#define RASM_ID21 21
#define RASM_ID22 22
#define RASM_ID23 23
#define RASM_ID24 24
#define RASM_OK_ID 30
#define RASM_CANCEL_ID 31
#define RASM_SET_ID 32
#define RASM_CLEAR_ID 33
/******************************** functions **********************************/
static void SetPinNames(int galtype);
static int CheckPinNames(int galtype);
static int PinNameRequester(int galtype);
static int RowActive(int row, int galtype);
static int OLMCOutput(int olmc, int mode);
static int MakeEquation(struct ActBuffer *buff, int olmc, int colsize,
int mode, int rowoffset, int numofrows);
static int Reasm(struct ActBuffer buff);
static void ReasmError(int errornum, int pinnum);
static char *PinNamePtr(int pinnum);
/******************************** variables **********************************/
extern struct AppString { LONG as_ID;
STRPTR as_Str;
};
extern struct AppString AppStrings[];
extern int OLMCSize22V10[];
extern int ToOLMC20RA10[];
extern char path[];
extern int JedecGALType;
extern char filename[]; /*Puffer für Filenamen*/
extern struct JedecStruct Jedec;
extern struct Catalog *catalog;
extern APTR app;
/* this vectors show which column of */
/* the logic array is connected to */
/* which pin */
int FuseToPin16Mode1[] = { 2,1,3,19,4,18,5,17,6,14,7,13,8,12,9,11 };
int FuseToPin16Mode2[] = { 2,1,3,18,4,17,5,16,6,15,7,14,8,13,9,11 };
int FuseToPin16Mode3[] = { 2,19,3,18,4,17,5,16,6,15,7,14,8,13,9,12 };
int FuseToPin20Mode1[] = { 2,1,3,23,4,22,5,21,6,20,7,17,8,16,9,15,10,14,11,13 };
int FuseToPin20Mode2[] = { 2,1,3,23,4,21,5,20,6,19,7,18,8,17,9,16,10,14,11,13 };
int FuseToPin20Mode3[] = { 2,23,3,22,4,21,5,20,6,19,7,18,8,17,9,16,10,15,11,14 };
int FuseToPin22V10[] = { 1,23,2,22,3,21,4,20,5,19,6,18,7,17,8,16,9,15,10,14,11,13 };
int FuseToPin20RA10[] = { 2,23,3,22,4,21,5,20,6,19,7,18,8,17,9,16,10,15,11,14 };
/* this vector shows which OLMC is */
/* connected to which row */
int OLMCToRow22V10[] = { 1, 10, 21, 34, 49, 66, 83, 98, 111, 122 };
/* pin names for 20 pins package */
char ReAsmPinNames20[20][10] = { "P1", "P2", "P3", "P4",
"P5", "P6", "P7", "P8",
"P9", "GND", "P11", "P12",
"P13", "P14", "P15", "P16",
"P17", "P18", "P19", "VCC"
};
/* pin names for 24 pins package */
char ReAsmPinNames24[24][10] = { "P1", "P2", "P3", "P4",
"P5", "P6", "P7", "P8",
"P9", "P10", "P11", "GND",
"P13", "P14", "P15", "P16",
"P17", "P18", "P19", "P20",
"P21", "P22", "P23", "VCC",
};
APTR strng_gad[24];
/******************************************************************************
** SetPinNames()
*******************************************************************************
** input: galtype type of GAL
**
** output: none
**
** remarks: This function does initialize the strings of the string gadgets
** of the reassembler requester.
******************************************************************************/
static void SetPinNames(int galtype)
{
int n, num_of_pins;
char name[4], numstrng[3];
if (galtype == GAL16V8) /* get number of pins */
num_of_pins = 20;
else
num_of_pins = 24;
for (n = 1; n <= num_of_pins; n++) /* set the pin names to */
{ /* there defaults */
if (n == num_of_pins/2)
{
set(strng_gad[n-1], MUIA_String_Contents, "GND");
}
else
{
if (n == num_of_pins)
{
set(strng_gad[n-1], MUIA_String_Contents, "VCC");
}
else
{
name[0] = 'P';
name[1] = (char)0;
sprintf(numstrng, "%d", n); /* make the pin number */
strcat(name, numstrng); /* add it to the string */
set(strng_gad[n-1], MUIA_String_Contents, name);
}
}
}
}
/******************************************************************************
** PinNamePtr()
*******************************************************************************
** input: pinnum pin number
** whether it is a valid number or not will NOT be
** checked!
**
** output: none
**
** remarks: This function returns a pointer to the pin name of the pin
** with the pin number "pinnum". The returned string must not be
** changed!
******************************************************************************/
static char *PinNamePtr(int pinnum)
{
char *name;
if (JedecGALType == GAL16V8)
name = &ReAsmPinNames20[pinnum - 1][0]; /* 20 pins package */
else
name = &ReAsmPinNames24[pinnum - 1][0]; /* 24 pins package */
return name;
}
/******************************************************************************
** CheckPinNames()
*******************************************************************************
** input: galtype type of GAL
**
** output: 0: o.k.
** <>0: error occured
**
** remarks: checks syntax of the pinnames
******************************************************************************/
static int CheckPinNames(int galtype)
{
char *name;
int numofpins, i, j, l, n;
if (JedecGALType == GAL16V8)
numofpins = 20;
else
numofpins = 24;
/*** check the pin names ***/
for (n = 0; n < numofpins; n++)
{
/* get a pointer to the */
name = PinNamePtr(n + 1); /* pin name */
/* are all characters of the */
/* pin name allowed? */
if (*name == '/')
name++;
if (!*name)
{ /* no characters? => error */
ReasmError(4, n+1);
return(4);
}
/* set pointer to next */
while (isalpha(*name) || isdigit(*name)) /* character which is not */
name++; /* a digit or a letter */
if (*name == '/') /* negation within the string? */
{ /* this is illegal! */
ReasmError(6, n+1);
return(6);
}
if (*name) /* any illegal character */
{
ReasmError(3, n+1);
return(3);
}
/* check whether some pin names */
for (l = 0; l < n; l++) /* are defined twice or not */
{
if (strcmp(PinNamePtr(l + 1), "NC")) /* NC is allowed to occure */
{ /* several times */
i = j = 0;
if (*(PinNamePtr(l + 1)) == '/') /* skip the negations */
i = 1;
if (*(PinNamePtr(n + 1)) == '/')
j = 1;
if (!strcmp(PinNamePtr(l + 1) + i, PinNamePtr(n + 1) + j))
{
ReasmError(2, n + 1); /* pin name is defined twice */
return(2);
}
}
}
/*GND as pin name at GAL's GND pin?*/
if (!strcmp(PinNamePtr(n+1), "GND"))
{
if (n + 1 != numofpins/2)
{
ReasmError(5, n + 1);
return(5);
}
}
if (n + 1 == numofpins/2)
{
if (strcmp(PinNamePtr(n + 1), "GND"))
{
ReasmError(7, n + 1);
return(7);
}
}
/*VCC as pin name at GAL's VCC pin?*/
if (!strcmp(PinNamePtr(n + 1), "VCC"))
{
if (n + 1 != numofpins)
{
ReasmError(5, n+1);
return(5);
}
}
if (n + 1 == numofpins)
{
if (strcmp(PinNamePtr(n + 1), "VCC"))
{
ReasmError(8, n+1);
return(8);
}
}
/* AR and SP are key words for 22V10 */
/* they are not allowed in the pin */
/* declaration */
if (JedecGALType == GAL22V10)
{
if (!strcmp(PinNamePtr(n + 1), "AR"))
{
ReasmError(9, n + 1);
return(9);
}
if (!strcmp(PinNamePtr(n + 1), "SP"))
{
ReasmError(10, n+1);
return(10);
}
}
}
return(0);
}
/******************************************************************************
** PinNameRequester()
*******************************************************************************
** input: galtype type of GAL
**
** output: TRUE: continue selected
** FALSE: cancel selected or error
**
** remarks: brings up a requester in which the names of the pins can be edited
******************************************************************************/
static int PinNameRequester(int galtype)
{
int n, open, done, result, num_of_pins;
ULONG id, signals;
APTR win;
APTR ok_gad, cancel_gad, set_gad, clear_gad;
STRPTR *str;
set(app, MUIA_Application_Sleep, TRUE); /* deactivate application */
/* make window object */
if (galtype == GAL16V8) /* 20 pin package */
{
num_of_pins = 20;
win = WindowObject,
MUIA_Window_Title, "Reassembler",
MUIA_Window_CloseGadget, FALSE,
MUIA_Window_NoMenus, TRUE,
MUIA_HelpNode, "MenReAsm",
WindowContents, GroupObject,
Child, ColGroup(4), GroupFrameT("GAL"),
MUIA_Group_VertSpacing, 0,
/* pins 1 and 20 */
Child, strng_gad[0] = StringObject, StringFrame,
MUIA_String_MaxLen, 10,
MUIA_String_Contents, &ReAsmPinNames20[0][0],
MUIA_String_Format, MUIV_String_Format_Right,
End,
Child, Label2("1"),
Child, Label2("20"),
Child, strng_gad[19] = String(&ReAsmPinNames20[19][0], 10),
/* pins 2 and 19 */
Child, strng_gad[1] = StringObject, StringFrame,
MUIA_String_MaxLen, 10,
MUIA_String_Contents, &ReAsmPinNames20[1][0],
MUIA_String_Format, MUIV_String_Format_Right,
End,
Child, Label2("2"),
Child, Label2("19"),
Child, strng_gad[18] = String(&ReAsmPinNames20[18][0], 10),
/* pins 3 and 18 */
Child, strng_gad[2] = StringObject, StringFrame,
MUIA_String_MaxLen, 10,
MUIA_String_Contents, &ReAsmPinNames20[2][0],
MUIA_String_Format, MUIV_String_Format_Right,
End,
Child, Label2("3"),
Child, Label2("18"),
Child, strng_gad[17] = String(&ReAsmPinNames20[17][0], 10),
/* pins 4 and 17 */
Child, strng_gad[3] = StringObject, StringFrame,
MUIA_String_MaxLen, 10,
MUIA_String_Contents, &ReAsmPinNames20[3][0],
MUIA_String_Format, MUIV_String_Format_Right,
End,
Child, Label2("4"),
Child, Label2("17"),
Child, strng_gad[16] = String(&ReAsmPinNames20[16][0], 10),
/* pins 5 and 16 */
Child, strng_gad[4] = StringObject, StringFrame,
MUIA_String_MaxLen, 10,
MUIA_String_Contents, &ReAsmPinNames20[4][0],
MUIA_String_Format, MUIV_String_Format_Right,
End,
Child, Label2("5"),
Child, Label2("16"),
Child, strng_gad[15] = String(&ReAsmPinNames20[15][0], 10),
/* pins 6 and 15 */
Child, strng_gad[5] = StringObject, StringFrame,
MUIA_String_MaxLen, 10,
MUIA_String_Contents, &ReAsmPinNames20[5][0],
MUIA_String_Format, MUIV_String_Format_Right,
End,
Child, Label2("6"),
Child, Label2("15"),
Child, strng_gad[14] = String(&ReAsmPinNames20[14][0], 10),
/* pins 7 and 14 */
Child, strng_gad[6] = StringObject, StringFrame,
MUIA_String_MaxLen, 10,
MUIA_String_Contents, &ReAsmPinNames20[6][0],
MUIA_String_Format, MUIV_String_Format_Right,
End,
Child, Label2("7"),
Child, Label2("14"),
Child, strng_gad[13] = String(&ReAsmPinNames20[13][0], 10),
/* pins 8 and 13 */
Child, strng_gad[7] = StringObject, StringFrame,
MUIA_String_MaxLen, 10,
MUIA_String_Contents, &ReAsmPinNames20[7][0],
MUIA_String_Format, MUIV_String_Format_Right,
End,
Child, Label2("8"),
Child, Label2("13"),
Child, strng_gad[12] = String(&ReAsmPinNames20[12][0], 10),
/* pins 9 and 12 */
Child, strng_gad[8] = StringObject, StringFrame,
MUIA_String_MaxLen, 10,
MUIA_String_Contents, &ReAsmPinNames20[8][0],
MUIA_String_Format, MUIV_String_Format_Right,
End,
Child, Label2("9"),
Child, Label2("12"),
Child, strng_gad[11] = String(&ReAsmPinNames20[11][0], 10),
/* pins 10 and 11 */
Child, strng_gad[9] = StringObject, StringFrame,
MUIA_String_MaxLen, 10,
MUIA_String_Contents, &ReAsmPinNames20[9][0],
MUIA_String_Format, MUIV_String_Format_Right,
End,
Child, Label2("10"),
Child, Label2("11"),
Child, strng_gad[10] = String(&ReAsmPinNames20[10][0], 10),
End,
Child, HGroup,
Child, ok_gad = SimpleButton(AppStrings[MSG_OK_GAD].as_Str),
Child, set_gad = SimpleButton(AppStrings[MSG_SET_GAD].as_Str),
Child, clear_gad = SimpleButton(AppStrings[MSG_CLEAR_GAD].as_Str),
Child, cancel_gad = SimpleButton(AppStrings[MSG_CANCEL_GAD].as_Str),
End,
End,
End;
}
else
{
num_of_pins = 24;
win = WindowObject,
MUIA_Window_Title, "Reassembler",
MUIA_Window_CloseGadget, FALSE,
MUIA_Window_NoMenus, TRUE,
WindowContents, GroupObject,
Child, ColGroup(4), GroupFrameT("GAL"),
MUIA_Group_VertSpacing, 0,
/* pins 1 and 24 */
Child, strng_gad[0] = StringObject, StringFrame,
MUIA_String_MaxLen, 10,
MUIA_String_Contents, &ReAsmPinNames24[0][0],
MUIA_String_Format, MUIV_String_Format_Right,
End,
Child, Label2("1"),
Child, Label2("24"),
Child, strng_gad[23] = String(&ReAsmPinNames24[23][0], 10),
/* pins 2 and 23 */
Child, strng_gad[1] = StringObject, StringFrame,
MUIA_String_MaxLen, 10,
MUIA_String_Contents, &ReAsmPinNames24[1][0],
MUIA_String_Format, MUIV_String_Format_Right,
End,
Child, Label2("2"),
Child, Label2("23"),
Child, strng_gad[22] = String(&ReAsmPinNames24[22][0], 10),
/* pins 3 and 22 */
Child, strng_gad[2] = StringObject, StringFrame,
MUIA_String_MaxLen, 10,
MUIA_String_Contents, &ReAsmPinNames24[2][0],
MUIA_String_Format, MUIV_String_Format_Right,
End,
Child, Label2("3"),
Child, Label2("22"),
Child, strng_gad[21] = String(&ReAsmPinNames24[21][0], 10),
/* pins 4 and 21 */
Child, strng_gad[3] = StringObject, StringFrame,
MUIA_String_MaxLen, 10,
MUIA_String_Contents, &ReAsmPinNames24[3][0],
MUIA_String_Format, MUIV_String_Format_Right,
End,
Child, Label2("4"),
Child, Label2("21"),
Child, strng_gad[20] = String(&ReAsmPinNames24[20][0], 10),
/* pins 5 and 20 */
Child, strng_gad[4] = StringObject, StringFrame,
MUIA_String_MaxLen, 10,
MUIA_String_Contents, &ReAsmPinNames24[4][0],
MUIA_String_Format, MUIV_String_Format_Right,
End,
Child, Label2("5"),
Child, Label2("20"),
Child, strng_gad[19] = String(&ReAsmPinNames24[19][0], 10),
/* pins 6 and 19 */
Child, strng_gad[5] = StringObject, StringFrame,
MUIA_String_MaxLen, 10,
MUIA_String_Contents, &ReAsmPinNames24[5][0],
MUIA_String_Format, MUIV_String_Format_Right,
End,
Child, Label2("6"),
Child, Label2("19"),
Child, strng_gad[18] = String(&ReAsmPinNames24[18][0], 10),
/* pins 7 and 18 */
Child, strng_gad[6] = StringObject, StringFrame,
MUIA_String_MaxLen, 10,
MUIA_String_Contents, &ReAsmPinNames24[6][0],
MUIA_String_Format, MUIV_String_Format_Right,
End,
Child, Label2("7"),
Child, Label2("18"),
Child, strng_gad[17] = String(&ReAsmPinNames24[17][0], 10),
/* pins 8 and 17 */
Child, strng_gad[7] = StringObject, StringFrame,
MUIA_String_MaxLen, 10,
MUIA_String_Contents, &ReAsmPinNames24[7][0],
MUIA_String_Format, MUIV_String_Format_Right,
End,
Child, Label2("8"),
Child, Label2("17"),
Child, strng_gad[16] = String(&ReAsmPinNames24[16][0], 10),
/* pins 9 and 16 */
Child, strng_gad[8] = StringObject, StringFrame,
MUIA_String_MaxLen, 10,
MUIA_String_Contents, &ReAsmPinNames24[8][0],
MUIA_String_Format, MUIV_String_Format_Right,
End,
Child, Label2("9"),
Child, Label2("16"),
Child, strng_gad[15] = String(&ReAsmPinNames24[15][0], 10),
/* pins 10 and 15 */
Child, strng_gad[9] = StringObject, StringFrame,
MUIA_String_MaxLen, 10,
MUIA_String_Contents, &ReAsmPinNames24[9][0],
MUIA_String_Format, MUIV_String_Format_Right,
End,
Child, Label2("10"),
Child, Label2("15"),
Child, strng_gad[14] = String(&ReAsmPinNames24[14][0], 10),
/* pins 11 and 14 */
Child, strng_gad[10] = StringObject, StringFrame,
MUIA_String_MaxLen, 10,
MUIA_String_Contents, &ReAsmPinNames24[10][0],
MUIA_String_Format, MUIV_String_Format_Right,
End,
Child, Label2("11"),
Child, Label2("14"),
Child, strng_gad[13] = String(&ReAsmPinNames24[13][0], 10),
/* pins 12 and 13 */
Child, strng_gad[11] = StringObject, StringFrame,
MUIA_String_MaxLen, 10,
MUIA_String_Contents, &ReAsmPinNames24[11][0],
MUIA_String_Format, MUIV_String_Format_Right,
End,
Child, Label2("12"),
Child, Label2("13"),
Child, strng_gad[12] = String(&ReAsmPinNames24[12][0], 10),
End,
Child, HGroup,
Child, ok_gad = SimpleButton(AppStrings[MSG_OK_GAD].as_Str),
Child, set_gad = SimpleButton(AppStrings[MSG_SET_GAD].as_Str),
Child, clear_gad = SimpleButton(AppStrings[MSG_CLEAR_GAD].as_Str),
Child, cancel_gad = SimpleButton(AppStrings[MSG_CANCEL_GAD].as_Str),
End,
End,
End;
}
/* set gadget IDs */
DoMethod(ok_gad, MUIM_Notify, MUIA_Pressed, FALSE,
app, 2, MUIM_Application_ReturnID, RASM_OK_ID);
DoMethod(set_gad, MUIM_Notify, MUIA_Pressed, FALSE,
app, 2, MUIM_Application_ReturnID, RASM_SET_ID);
DoMethod(clear_gad, MUIM_Notify, MUIA_Pressed, FALSE,
app, 2, MUIM_Application_ReturnID, RASM_CLEAR_ID);
DoMethod(cancel_gad, MUIM_Notify, MUIA_Pressed, FALSE,
app, 2, MUIM_Application_ReturnID, RASM_CANCEL_ID);
for (n = 0; n < num_of_pins; n++)
DoMethod(strng_gad[n], MUIM_Notify, MUIA_Pressed, FALSE,
app, 2, MUIM_Application_ReturnID, RASM_ID01 + n);
/* init cycle chain */
if (num_of_pins == 20)
DoMethod(win, MUIM_Window_SetCycleChain,
strng_gad[ 0], strng_gad[ 1], strng_gad[ 2], strng_gad[ 3],
strng_gad[ 4], strng_gad[ 5], strng_gad[ 6], strng_gad[ 7],
strng_gad[ 8], strng_gad[ 9], strng_gad[10], strng_gad[11],
strng_gad[12], strng_gad[13], strng_gad[14], strng_gad[15],
strng_gad[16], strng_gad[17], strng_gad[18], strng_gad[19],
ok_gad, set_gad, clear_gad, cancel_gad, NULL);
else
DoMethod(win, MUIM_Window_SetCycleChain,
strng_gad[ 0], strng_gad[ 1], strng_gad[ 2], strng_gad[ 3],
strng_gad[ 4], strng_gad[ 5], strng_gad[ 6], strng_gad[ 7],
strng_gad[ 8], strng_gad[ 9], strng_gad[10], strng_gad[11],
strng_gad[12], strng_gad[13], strng_gad[14], strng_gad[15],
strng_gad[16], strng_gad[17], strng_gad[18], strng_gad[19],
strng_gad[20], strng_gad[21], strng_gad[22], strng_gad[23],
ok_gad, set_gad, clear_gad, cancel_gad, NULL);
if (win) /* window object created? */
{
DoMethod(app, OM_ADDMEMBER, win); /* add win to application */
set(win, MUIA_Window_Open, TRUE); /* open window */
get(win, MUIA_Window_Open, &open);
if (open) /* is window opened? */
{
done = FALSE;
while (!done)
{
id = DoMethod(app, MUIM_Application_Input, &signals);
switch (id)
{
case RASM_OK_ID: /* OK selected */
/* copy names into buffers */
for (n = 0; n < num_of_pins; n++)
{
get(strng_gad[n], MUIA_String_Contents, &str);
if (num_of_pins == 20) /* 20 pins package? */
strcpy(ReAsmPinNames20[n], (const char *)str);
else
strcpy(ReAsmPinNames24[n], (const char *)str);
}
/* check the syntax of the pin names */
if (!CheckPinNames(galtype))
{
result = TRUE;
done = TRUE; /* that's it */
}
break;
case RASM_CANCEL_ID:
result = FALSE; /* Cancel selected */
done = TRUE; /* that's it */
break;
case RASM_CLEAR_ID: /* clear pin names */
for (n = 0; n < num_of_pins; n++)
set(strng_gad[n], MUIA_String_Contents, "");
break;
case RASM_SET_ID: /* set pin names */
SetPinNames(galtype);
break;
}
if (!done && signals)
Wait(signals); /* wait for the next event */
}
set(win, MUIA_Window_Open, FALSE); /* close window */
}
DoMethod(app, OM_REMMEMBER, win); /* remove win from app. */
MUI_DisposeObject(win); /* delete window object */
}
set(app, MUIA_Application_Sleep, FALSE); /* reactivate application */
return result;
}
/******************************************************************************
** RowActive()
*******************************************************************************
** input: row row which should be tested
** galtype type of GAL
**
** ouput: 0: row is not active
** 1: row is active
** 2: row is active but includes only "1" (means VCC)
**
** remarks: This function tests whether or not a row of the logic array is
** active (checks PT bits of the GAL16V8 and GAL20V8 and searchs
** for the expression A * /A).
******************************************************************************/
static int RowActive(int row, int galtype)
{
int n, colsize, flag;
switch (galtype)
{ /* get number of columns */
case GAL16V8:
colsize = MAX_FUSE_ADR16 + 1;
break;
case GAL20V8:
colsize = MAX_FUSE_ADR20 + 1;
break;
case GAL22V10:
colsize = MAX_FUSE_ADR22V10 + 1;
break;
case GAL20RA10:
colsize = MAX_FUSE_ADR20RA10 + 1;
break;
}
if (galtype == GAL16V8 || galtype == GAL20V8)
if (!Jedec.GALPT[row]) /* check PT-bit which */
return(0); /* enables/disables a row */
flag = 0;
for (n = 0; n < colsize; n++)
{ /* search for "A * /A" */
if (!Jedec.GALLogic[row*colsize + n])
{
flag = 1;
if (!(n % 2))
if (!Jedec.GALLogic[row*colsize + n + 1])
return(0);
}
}
if (flag)
return(1);
else
return(2);
}
/******************************************************************************
** OLMCOutput()
*******************************************************************************
** input: olmc OLMC which should be tested
** mode mode of the GAL (only when 16V8/20V8)
**
** output: 0: no output
** 1: output (there is an equation which describes this
** output pin)
**
** remarks: checks whether or not an OLMC pin is programmed as an output
******************************************************************************/
static int OLMCOutput(int olmc, int mode)
{
int n, flag;
flag = 0;
if (JedecGALType == GAL16V8 || JedecGALType == GAL20V8)
{
if (mode == 1 && Jedec.GALAC1[olmc])
return(0);
for (n = 0; n < 8; n++)
{
if (!n && ((mode == 2) || ((mode == 3) && Jedec.GALAC1[olmc])))
{
if (!RowActive(olmc*8, JedecGALType)) /*tristate enable = GND?*/
return(0); /*yes, then input pin */
}
else
{
if (RowActive(olmc*8 + n, JedecGALType))
flag = 1;
}
}
}
if (JedecGALType == GAL22V10) /* pin is an output when tristate */
if (RowActive(OLMCToRow22V10[olmc], JedecGALType)) /* can be HIGH/LOW */
return(1);
if (JedecGALType == GAL20RA10) /* pin is an output when tristate */
if (RowActive(olmc*8, JedecGALType)) /* can be HIGH/LOW */
return(1);
return(flag);
}
/******************************************************************************
** MakeEquation()
*******************************************************************************
** input: buff pointer to the ActBuffer structure
** olmc number of the OLMC
** colsize number of columns
** mode mode of GAL
** 0: no mode used
** 1: combinational (only for GAL16V8/GAL20V8)
** 2: tristate (only for GAL16V8/GAL20V8)
** 3: register (only for GAL16V8/GAL20V8)
** 4: asynchronous reset (only for GAL22V10)
** 5: snychronous preset (only for GAL22V10
** rowoffset where to start to build the equation
** numofrows number of rows from which the equation should be build
**
** output: 0: no errors
** -1: error occured (out of memory)
**
** remarks: This function examines the rows of an OLMC and generates the
** equation.
******************************************************************************/
static int MakeEquation(struct ActBuffer *buff, int olmc, int colsize, int mode,
int rowoffset, int numofrows)
{
int ORflag, ANDflag, pin, m, n, result, numofchar;
int offset, row;
struct ActBuffer startbuff;
startbuff = *buff; /* save pointer*/
numofchar = 8;
ORflag = 0;
n = rowoffset;
while (n < rowoffset + numofrows)
{
if (JedecGALType == GAL22V10)
{ /* 22V10 => different sizes */
/* of OLMCs and additional */
row = OLMCToRow22V10[olmc]; /* AS and RS rows */
if (mode == 4)
row = 0; /* asynch. reset */
else
if (mode == 5)
row = 131; /* synch. preset */
}
else
row = olmc*8; /* 16V8,20V8,20RA10: OLMC size */
/* is constant (=8) */
result = RowActive(row + n, JedecGALType);
if (result == 1)
{ /* is row active? */
if (ORflag)
{ /* yes, then OR */
if (AddString(buff, (UBYTE *)" + "))
return(-1);
numofchar += 3; /* count characters */
}
ORflag = 1;
ANDflag = 0;
for (m = 0; m < colsize; m++)
{
if (JedecGALType == GAL22V10)
{ /* 22V10 => different sizes */
/* of OLMCs and additional */
/* AS and RS rows */
offset = (OLMCToRow22V10[olmc] + n)*colsize;
if (mode == 4)
offset = 0; /* asynch. reset */
else
if (mode == 5)
offset = 5764; /* synch. preset */
}
else
offset = (olmc*8 + n)*colsize; /* 16V8,20V8,20RA10: OLMC */
/* size is constant (=8) */
if (!Jedec.GALLogic[offset + m])
{ /* fuse = 0? */
if (ANDflag)
{
if (AddByte(buff, (UBYTE)'*')) /* evaluate prod. term */
return(-1);
numofchar++;
}
ANDflag = 1;
/*** GAL16V8 ***/
if (JedecGALType == GAL16V8)
{
if (mode == 1) /* get pin number */
pin = FuseToPin16Mode1[m/2];
if (mode == 2)
pin = FuseToPin16Mode2[m/2];
if (mode == 3)
pin = FuseToPin16Mode3[m/2];
/* was there a negation in */
/* in the declaration? */
if (((*PinNamePtr(pin) == '/') && !(m % 2)) ||
((*PinNamePtr(pin) != '/') && (m % 2)))
{
if (AddByte(buff, (UBYTE)'/'))
return(-1);
numofchar++;
}
/* write pin name without '/' */
if (*PinNamePtr(pin) == '/')
{
if (AddString(buff, (PinNamePtr(pin) + 1L)))
return(-1);
}
else
{
if (AddString(buff, PinNamePtr(pin)))
return(-1);
}
numofchar += (int)strlen(PinNamePtr(pin));
}
else
{ /*** GAL20V8, 22V10, 20RA10 ***/
if (JedecGALType == GAL20V8)
{
if (mode == 1) /* get pin number */
pin = FuseToPin20Mode1[m/2];
if (mode == 2)
pin = FuseToPin20Mode2[m/2];
if (mode == 3)
pin = FuseToPin20Mode3[m/2];
}
if (JedecGALType == GAL22V10)
pin = FuseToPin22V10[m/2];
if (JedecGALType == GAL20RA10)
pin = FuseToPin20RA10[m/2];
/* handle the negation sign */
if (JedecGALType == GAL22V10 &&
pin >= 14 && pin <= 23 &&
!Jedec.GALS1[23 - pin])
{ /* registered 22V10 OLMC: */
/* sign of feedback is contrary to */
/* that of other GALs and/or modes */
if (((*PinNamePtr(pin) == '/') && (m % 2)) ||
((*PinNamePtr(pin) != '/') && !(m % 2)))
{
if (AddByte(buff, (UBYTE)'/'))
return(-1);
numofchar++;
}
}
else
{ /* was there a negation in */
/* the pin declaration? */
if (((*PinNamePtr(pin) == '/') && !(m % 2)) ||
((*PinNamePtr(pin) != '/') && (m % 2)))
{
if (AddByte(buff, (UBYTE)'/'))
return(-1);
numofchar++;
}
}
/* add pin name without */
/* leading '/' */
if (*PinNamePtr(pin) == '/')
{
if (AddString(buff, PinNamePtr(pin) + 1L))
return(-1);
}
else
{
if (AddString(buff, PinNamePtr(pin)))
return(-1);
}
numofchar += (int)strlen(PinNamePtr(pin));
}
if (numofchar > 60)
{ /* new line? */
if (AddString(buff, (UBYTE *)"\n "))
return(-1);
numofchar = 8;
}
}
}
}
if (result == 2)
{ /* only '1' in all rows? */
*buff = startbuff; /* then VCC */
if (AddString(buff, (UBYTE *)"VCC"))
return(-1);
break;
}
n++;
}
if (AddString(buff, (UBYTE *)"\n\n")) /* end of the equation */
return(-1);
return(0);
}
/******************************************************************************
** Reasm()
*******************************************************************************
** input: buff buffer in which the source file should be stored
**
** output: 0: no errors
** <>0: error
**
** remarks: This function reassembles a JEDEC file and gernerates the
** appropriate source file. The source file is stored in the buffer
** described by "buff".
******************************************************************************/
static int Reasm(struct ActBuffer buff)
{
int mode, n, numofpins, byte, tricon;
int firstOLMC, olmc, colsize, numofOLMCs;
UBYTE *ptr;
/*** write type of GAL ***/
switch (JedecGALType)
{
case GAL16V8:
if (AddString(&buff, (UBYTE *)"GAL16V8\n"))
return(-1);
numofpins = 20;
numofOLMCs = 8;
firstOLMC = 19;
colsize = MAX_FUSE_ADR16 + 1;
break;
case GAL20V8:
if (AddString(&buff, (UBYTE *)"GAL20V8\n"))
return(-1);
numofpins = 24;
numofOLMCs = 8;
firstOLMC = 22;
colsize = MAX_FUSE_ADR20 + 1;
break;
case GAL22V10:
if (AddString(&buff, (UBYTE *)"GAL22V10\n"))
return(-1);
numofpins = 24;
numofOLMCs = 10;
firstOLMC = 23;
colsize = MAX_FUSE_ADR22V10 + 1;
break;
case GAL20RA10:
if (AddString(&buff, (UBYTE *)"GAL20RA10\n"))
return(-1);
numofpins = 24;
numofOLMCs = 10;
firstOLMC = 23;
colsize = MAX_FUSE_ADR20RA10 + 1;
break;
}
byte = 0; /*** write signature ***/
for (n = 0; n < SIG_SIZE; n++)
{
byte |= Jedec.GALSig[n]; /* put 8 bits to one byte */
/* together */
if (!((n+1)%8))
{
if (!isprint(byte))
byte = '.';
if (AddByte(&buff, (UBYTE)byte))
return(-1);
byte = 0;
}
byte <<= 1;
}
if (AddString(&buff, (UBYTE *)"\n\n")) /* new lines */
return(-1);
/*** write pin declaration ***/
for (n = 1; n <= numofpins; n++)
{
if (JedecGALType == GAL16V8)
{
if (AddString(&buff, PinNamePtr(n)))
return(-1);
}
else
if (AddString(&buff, PinNamePtr(n)))
return(-1);
if (n == numofpins/2)
{
if (AddString(&buff, (UBYTE *)"\n"))
return(-1);
}
else
{
if (AddString(&buff, (UBYTE *)" "))
return(-1);
}
}
if (AddString(&buff, (UBYTE *)"\n\n"))
return(-1);
mode = 0;
if (JedecGALType == GAL16V8 || JedecGALType == GAL20V8)
{
if (!Jedec.GALAC0 && !Jedec.GALSYN)
{ /* check mode of GAL */
ReasmError(1, 0); /* error? then return */
return(1);
}
/* get mode of GAL */
if (!Jedec.GALSYN)
{ /* if SYN = 0 then mode 3 */
mode = 3; /* (register) */
}
else
{
if (Jedec.GALSYN && Jedec.GALAC0)
mode = 2; /* tristate mode */
else
mode = 1; /* combinational mode */
}
}
/*** generate the equations ***/
for (olmc = 0; olmc < numofOLMCs; olmc++)
{ /* all OLMCs */
tricon = 0;
if (OLMCOutput(olmc, mode)) /* is OLMC an output? */
{
/* is there a negation in */
/* the pin declaration */
if (((*PinNamePtr(firstOLMC - olmc) == '/') && Jedec.GALXOR[olmc]) ||
((*PinNamePtr(firstOLMC - olmc) != '/') && !Jedec.GALXOR[olmc]))
{
if (AddByte(&buff, (UBYTE)'/'))
return(-1);
}
/* write pin name without '/' */
if (*PinNamePtr(firstOLMC - olmc) == '/')
{
if (AddString(&buff, ptr = PinNamePtr(firstOLMC - olmc) + 1L))
return(-1);
}
else
{
if (AddString(&buff, ptr = PinNamePtr(firstOLMC - olmc)))
return(-1);
}
/*** get type of output ***/
if (JedecGALType == GAL16V8 || JedecGALType == GAL20V8)
{
if (mode == 2 || (mode == 3 && Jedec.GALAC1[olmc]))
{
if (AddString(&buff, (UBYTE *)".T"))
return(-1);
tricon = 1; /* there is a tristate output, */
} /* so set tricon flag */
if (mode == 3 && !Jedec.GALAC1[olmc])
if (AddString(&buff, (UBYTE *)".R"))
return(-1);
if (AddString(&buff, (UBYTE *)" = "))
return(-1);
n = 0; /* if there is a tristate control */
if (mode == 2 || (mode == 3 && Jedec.GALAC1[olmc]))
n++; /* skip first row of OLMC */
if (MakeEquation(&buff, olmc, colsize, mode, n, 8 - n))
return(-1);
/* write the equation */
if (tricon) /* of the tristate control */
{
/* write pin name with leading */
/* '/' if there is one */
if (AddString(&buff, PinNamePtr(firstOLMC - olmc)))
return(-1);
if (AddString(&buff, (UBYTE *)".E = ")) /*tristate enable*/
return(-1);
/* write equation*/
if (MakeEquation(&buff, olmc, colsize, mode, 0, 1))
return(-1);
}
}
if (JedecGALType == GAL22V10)
{
if (Jedec.GALS1[olmc])
{ /* get type of output */
if (AddString(&buff, (UBYTE *)".T = "))
return(-1);
}
else
if (AddString(&buff, (UBYTE *)".R = "))
return(-1);
/* write output's equation */
if (MakeEquation(&buff, olmc, colsize, 0, 1,
OLMCSize22V10[olmc] - 1))
return(-1);
/* write equation of */
/* tristate control */
/* write pin name with leading */
/* '/' if there is one */
if (AddString(&buff, PinNamePtr(firstOLMC - olmc)))
return(-1);
if (AddString(&buff, (UBYTE *)".E = ")) /* tristate enable */
return(-1);
/* write equation */
if (MakeEquation(&buff, olmc, colsize, 0, 0, 1))
return(-1);
}
if (JedecGALType == GAL20RA10)
{
/* write equation of output */
if (RowActive(ToOLMC20RA10[9 - olmc] + 2, JedecGALType) == 2 &&
RowActive(ToOLMC20RA10[9 - olmc] + 3, JedecGALType) == 2)
{
if (AddString(&buff, (UBYTE *)" = "))/* if ARST and APRST */
return(-1); /* = VCC, then */
} /* tristate output */
else
{
if (AddString(&buff, (UBYTE *)".R = "))
return(-1);
}
if (MakeEquation(&buff, olmc, colsize, 0, 4, 4))
return(-1);
/* write pin name with leading */
/* '/' if there is one */
if (AddString(&buff, PinNamePtr(firstOLMC - olmc)))
return(-1);
if (AddString(&buff, (UBYTE *)".E = "))
return(-1);
if (MakeEquation(&buff, olmc, colsize, 0, 0, 1))
return(-1);
if (RowActive(olmc * 8 + 1, JedecGALType))
{
if (AddString(&buff, ptr)) /* write equation of */
return(-1); /* Clock */
if (AddString(&buff, (UBYTE *)".CLK = "))
return(-1);
if (MakeEquation(&buff, olmc, colsize, 0, 1, 1))
return(-1);
}
if (RowActive(olmc*8 + 2, JedecGALType))
{
if (AddString(&buff, ptr)) /* write equation of */
return(-1); /* asynchronous reset */
if (AddString(&buff, (UBYTE *)".ARST = "))
return(-1);
if (MakeEquation(&buff, olmc, colsize, 0, 2, 1))
return(-1);
}
if (RowActive(olmc*8 + 3, JedecGALType))
{
if (AddString(&buff, ptr)) /* write equation of */
return(-1); /* asynchronous preset */
if (AddString(&buff, (UBYTE *)".APRST = "))
return(-1);
if (MakeEquation(&buff, olmc, colsize, 0, 3, 1))
return(-1);
}
}
}
}
/*** write asynchronous reset and ***/
/*** synchronous preset ***/
if (JedecGALType == GAL22V10)
{
if (RowActive(0, JedecGALType))
{
if (AddString(&buff, (UBYTE *)"AR = ")) /* asyn. reset */
return(-1);
if (MakeEquation(&buff, olmc, colsize, 4, 0, 1))
return(-1);
}
if (RowActive(131, JedecGALType))
{
if (AddString(&buff, (UBYTE *)"SP = ")) /* synch. preset */
return(-1);
if (MakeEquation(&buff, olmc, colsize, 5, 0, 1))
return(-1);
}
}
/*** write ending text ***/
if (AddString(&buff,"DESCRIPTION:\nThis is a reassembled file. Used JEDEC file: '"))
return(-1);
if (AddString(&buff, (UBYTE *)&filename[0]))
return(-1);
if (AddString(&buff, (UBYTE *)"'\n\n"))
return(-1);
return(0); /* no errors, finish*/
}
/******************************************************************************
** Reassembler()
*******************************************************************************
** input: none
** output: none
**
** remarks: reassembles a JEDEC file and writes the source file
******************************************************************************/
void Reassembler(void)
{
struct Buffer *reasm_buff;
struct ActBuffer mybuff;
BPTR fh;
UBYTE *filebuffer, *filebuffer2;
int result;
if (MyFileReq(AppStrings[MSG_LOADJED].as_Str, ".jed", YES, LOAD))
{
if (!(GetJedec((UBYTE *)&path[0])))
{ /* get the JEDEC file */
if (!PinNameRequester(JedecGALType))
return;
if (!(reasm_buff = (struct Buffer *)
AllocMem((long)sizeof(struct Buffer),MEMF_PUBLIC|MEMF_CLEAR)))
{
ErrorReq(2); /* out of memory */
return;
}
mybuff.ThisBuff = reasm_buff;
mybuff.Entry = (UBYTE *)(&reasm_buff->Entries[0]);
mybuff.BuffEnd = (UBYTE *)reasm_buff + (long)sizeof(struct Buffer);
if (!Reasm(mybuff) && MyFileReq(AppStrings[MSG_WRITE_SOURCE].as_Str,
".pld", YES, SAVE))
{
PrintText(AppStrings[MSG_WRITING_SOURCE].as_Str, 1);
if ((fh = Open(&path[0], (long)MODE_NEWFILE)))
{
for (;;)
{
filebuffer = filebuffer2 = mybuff.Entry;
while (filebuffer2 < mybuff.BuffEnd)
{ /* get buffer size */
if (!*filebuffer2)
break;
filebuffer2++;
}
/* write buffer */
result = Write(fh, (char *)filebuffer,
(long)(filebuffer2-filebuffer));
if (result == -1L)
{ /* write error? */
Close(fh); /* yes, then shut down */
FreeBuffer(reasm_buff);
PrintText(AppStrings[MSG_ERROR].as_Str, 0);
ErrorReq(13);
return;
}
if (!mybuff.ThisBuff->Next) /* if there is no more */
break; /* buffer, break loop */
mybuff.ThisBuff = mybuff.ThisBuff->Next;
mybuff.Entry = (UBYTE *)(&mybuff.ThisBuff->Entries[0]);
mybuff.BuffEnd = (UBYTE *)mybuff.ThisBuff +
(long)sizeof(struct Buffer);
}
Close(fh);
}
else
{
FreeBuffer(reasm_buff); /*error?, then cancel */
PrintText(AppStrings[MSG_ERROR].as_Str, 0);
ErrorReq(13); /* can't open file */
return;
}
PrintText(AppStrings[MSG_LOWER_OK].as_Str, 0);
}
FreeBuffer(reasm_buff); /* free allocated memory */
}
}
}
/******************************************************************************
** ReasmError()
*******************************************************************************
** input: errornum error number to be printed
** pinnum pinnumber to be printed
**
** output: none
**
** remarks: prints an error messages
******************************************************************************/
static void ReasmError(int errornum, int pinnum)
{
#define PINNUM_POS 7
char string[40];
switch (errornum)
{
case 1:
TxtRequest(AppStrings[MSG_REASM_ERR].as_Str,
AppStrings[MSG_CANCEL_GAD].as_Str, NULL);
PrintText(AppStrings[MSG_ERR_REASM1].as_Str, 1);
break;
case 2:
strcpy(string, AppStrings[MSG_ERR_REASM2].as_Str);
sprintf(&string[PINNUM_POS], "%2d", pinnum);
string[PINNUM_POS + 2] = ':';
TxtRequest(string, AppStrings[MSG_CANCEL_GAD].as_Str, NULL);
break;
case 3:
strcpy(string, AppStrings[MSG_ERR_REASM3].as_Str);
sprintf(&string[PINNUM_POS], "%2d", pinnum);
string[PINNUM_POS + 2] = ':';
TxtRequest(string, AppStrings[MSG_CANCEL_GAD].as_Str, NULL);
break;
case 4:
strcpy(string, AppStrings[MSG_ERR_REASM4].as_Str);
sprintf(&string[PINNUM_POS], "%2d", pinnum);
string[PINNUM_POS + 2] = ':';
TxtRequest(string, AppStrings[MSG_CANCEL_GAD].as_Str, NULL);
break;
case 5:
strcpy(string, AppStrings[MSG_ERR_REASM5].as_Str);
sprintf(&string[PINNUM_POS], "%2d", pinnum);
string[PINNUM_POS + 2] = ':';
TxtRequest(string, AppStrings[MSG_CANCEL_GAD].as_Str, NULL);
break;
case 6:
strcpy(string, AppStrings[MSG_ERR_REASM6].as_Str);
sprintf(&string[PINNUM_POS], "%2d", pinnum);
string[PINNUM_POS + 2] = ':';
TxtRequest(string, AppStrings[MSG_CANCEL_GAD].as_Str, NULL);
break;
case 7:
strcpy(string, AppStrings[MSG_ERR_REASM7].as_Str);
sprintf(&string[PINNUM_POS], "%2d", pinnum);
string[PINNUM_POS + 2] = ':';
TxtRequest(string, AppStrings[MSG_CANCEL_GAD].as_Str, NULL);
break;
case 8:
strcpy(string, AppStrings[MSG_ERR_REASM8].as_Str);
sprintf(&string[PINNUM_POS], "%2d", pinnum);
string[PINNUM_POS + 2] = ':';
TxtRequest(string, AppStrings[MSG_CANCEL_GAD].as_Str, NULL);
break;
case 9:
strcpy(string, AppStrings[MSG_ERR_REASM9].as_Str);
sprintf(&string[PINNUM_POS], "%2d", pinnum);
string[PINNUM_POS + 2] = ':';
TxtRequest(string, AppStrings[MSG_CANCEL_GAD].as_Str, NULL);
break;
case 10:
strcpy(string, AppStrings[MSG_ERR_REASM10].as_Str);
sprintf(&string[PINNUM_POS], "%2d", pinnum);
string[PINNUM_POS + 2] = ':';
TxtRequest(string, AppStrings[MSG_CANCEL_GAD].as_Str, NULL);
break;
}
}
/* EOF */